package com.wms.provider.util;

import org.springframework.messaging.Message;

import java.util.Iterator;
import java.util.List;

/**
 * Description: [消息分割]
 * <p>
 * 发送大小：
 * 默认情况下，一批发送的消息总大小不能超过4MB字节，如果想超出该值，有两种解决方案：
 * 方案一：将批量消息进行拆分，拆分为若干不大于4M的消息集合分多次批量发送，一般不大于1M。
 * 方案二：在Producer端与Broker端修改属性。
 * Producer端需要在发送之前设置Producer的maxMessageSize属性
 * Broker端需要修改其加载的配置文件中的maxMessageSize属性
 */
public class MessageSplitter implements Iterator<List<Message>> {

    /**
     * 分割数据大小
     */
    private final int sizeLimit = 1024 * 1024;

    /**
     * 分割数据列表
     */
    private final List<Message> messages;

    /**
     * 分割索引
     */
    private int currIndex;

    public MessageSplitter(List<Message> messages) {
        this.messages = messages;
        messages.forEach(m -> {
            if (m.toString().length() > sizeLimit) {
                throw new RuntimeException("单条消息不能大于" + sizeLimit + "B");
            }
        });
    }


    @Override
    public boolean hasNext() {
        return currIndex < messages.size();
    }

    @Override
    public List<Message> next() {
        int nextIndex = currIndex;
        int totalSize = 0;
        for (; nextIndex < messages.size(); nextIndex++) {
            Message t = messages.get(nextIndex);
            totalSize = totalSize + t.toString().length();
            if (totalSize > sizeLimit) {
                break;
            }
        }
        List<Message> subList = messages.subList(currIndex, nextIndex);
        currIndex = nextIndex;
        return subList;
    }
}
